<?php
class CodigoDocumentosController extends AppController{

    var $name = 'CodigoDocumentos';
    var $appModule = 'Maestros';
    var $helpers = array('Html', 'Form', 'Javascript', 'Codigo', 'Time','GetList','AdcReporter');
    var $components = array('RequestHandler');
    var $paginate = array('order'=>array('id'));
    var $uses = array('CodigoDocumento', 'Usuario');

    function index() {
        //verificando si se hizo busqueda por formulario
        $q = $this->getBusqueda($this->data['CodigoDocumentoAlmacen']['busqueda']);

        $conditions['CodigoDocumento.activo'] = true;
        if (!empty($q)){
            $conditions['OR'] = array(                
                'CodigoDocumento.descripcion  SIMILAR TO' => "%$q%",
                'CodigoDocumento.simbolo  SIMILAR TO' => "%$q%"
            );
            if (is_numeric($q))
                $conditions['OR']['CodigoDocumento.id']=explode('|', str_replace(array('(',')'),'',$q));
        }
        $this->paginate['CodigoDocumento'] = array(
            'conditions'=>$conditions,
            'order'=>'id',
            'recirsive'=>-1
        );
        $codigoDocumentos = $this->paginate('CodigoDocumento');
        $this->set(compact('codigoDocumentos'));
        $this->set('limite', $this->limite);
    }

    function view($id = null) {
            $this->CodigoDocumento->recursive = 2;
            if (!$id) {
                    $this->Session->setFlash(__('Id de Codigo de documento no valido.', true));
                    $this->redirect(array('action'=>'index'));
            }
            $codigo = $this->CodigoDocumento->read(null, $id);
            $this->set('codigoDocumento', $codigo);
    }

    function add(){
        if (!empty($this->data)){
            $done = true;
            $this->CodigoDocumento->begin();
            try{
                $this->CodigoDocumento->create();
                $usuario = $this->Session->read('Usuario');
                $this->data['CodigoDocumento']['activo'] = true;
                $this->data['CodigoDocumento']['usuario_creacion_id'] = $this->_usuario['id'];
                $this->data['CodigoDocumento']['fecha_creacion'] = 'now()';
                if ($this->CodigoDocumento->save($this->data)){
                    unset($this->data['CodigoDocumentoDetalle']['$']); // sacando la fila muestra

                    foreach($this->data['CodigoDocumentoDetalle'] as $detalle){
                        if (($detalle['fecha_ampliacion']) == '')
                            $detalle['fecha_ampliacion'] = null;

                        $detalle['codigo_documento_id'] = $this->CodigoDocumento->id;
                        $detalle['empresa_id'] = $this->empresaId();                        
                        $detalle['usuario_creacion_id'] = $this->_usuario['id'];
                        $detalle['fecha_creacion'] = 'now()';
                        $this->CodigoDocumento->CodigoDocumentoDetalle->create();
                        if (!$this->CodigoDocumento->CodigoDocumentoDetalle->save($detalle)){
                            $done = false;
                            break;
                        } else {
                            if (array_key_exists('SeriesUsuario', $detalle)){
                                foreach($detalle['SeriesUsuario'] as $usuario){
                                    $this->CodigoDocumento->CodigoDocumentoDetalle->SeriesUsuario->create();
                                    $usuario['serie_id'] = $this->CodigoDocumento->CodigoDocumentoDetalle->id;
                                    if (!$this->CodigoDocumento->CodigoDocumentoDetalle->SeriesUsuario->save($usuario)){
                                        $done = false;
                                        break;
                                    }
                                }
                            }
                        }
                    }
                } else $done = false;

                if ($done){
                    $this->CodigoDocumento->commit();
                    $this->Session->setFlash('Se ha adicionado correctamente el Codigo de Documento');
                    $this->redirect(array('action'=>'index'));
                } else {
                    $this->CodigoDocumento->rollback();
                    $this->Session->setFlash('Se ha producido un error al adicionar el Codigo de Documento');
                }
            } catch(Exception $e) {
                    $this->CodigoDocumento->rollback();
                    $this->Session->setFlash('Se ha producido un error al adicionar el Codigo de Documento');
            }
        }
        $this->set('usuarios', 
                $this->Usuario->find('list', array(
                    'fields'=>array('Usuario.id', 'Usuario.usuario'),
                    'order'=>array('Usuario.usuario'),
                    'conditions'=>array('Usuario.activo'=>true)
                )
        ));
    }

    function edit($id = null){
        if (!$id) {
            $this->Session->setFlash(__('Id de Codigo de Documento invalido', true));
            $this->redirect(array('action'=>'index'));
        }
        if (!empty($this->data)){
            $done = true;
            $this->CodigoDocumento->begin();
			if($this->data['CodigoDocumento']['centro_dist_id']!=$this->centroDistId()){
				$this->Session->setFlash(__('El deposito no coincide con la sesion', true));
				$this->redirect(array('action'=>'index'));
			}
            try{		
                // $this->CodigoDocumento->create();
                // $usuario = $this->Session->read('Usuario');
                $usuario = $this->usuarioId();				
                $this->data['CodigoDocumento']['usuario_modificacion_id'] = $this->_usuario['id'];
                $this->data['CodigoDocumento']['fecha_modificacion'] = 'now()';
                // echo'<pre>';print_r($this->data);die;
				if ($this->CodigoDocumento->save($this->data)){
                    unset($this->data['CodigoDocumentoDetalle']['$']); // sacando la fila muestra
                    $done = $this->CodigoDocumento->CodigoDocumentoDetalle->deleteAll(array(
                        'codigo_documento_id'=>$this->CodigoDocumento->id,
						'centro_dist_id'=>$this->centroDistId(),
                    ));
                    if ($done)
                        foreach($this->data['CodigoDocumentoDetalle'] as $detalle){
                            $detalle['codigo_documento_id'] = $this->CodigoDocumento->id;
                            $detalle['empresa_id'] = $this->empresaId();
                            $detalle['usuario_modificacion_id'] = $this->usuarioId();
                            $detalle['fecha_modificacion'] = 'now()';
                            if (($detalle['fecha_ampliacion']) == '')
                                $detalle['fecha_ampliacion'] = null;
                            $this->CodigoDocumento->CodigoDocumentoDetalle->create();
                            if (!$this->CodigoDocumento->CodigoDocumentoDetalle->save($detalle)){
                                $done = false;
                                break;
                            } else {
                                if (array_key_exists('SeriesUsuario', $detalle)){
                                    foreach($detalle['SeriesUsuario'] as $usuario){
                                        $this->CodigoDocumento->CodigoDocumentoDetalle->SeriesUsuario->create();
                                        $usuario['serie_id'] = $this->CodigoDocumento->CodigoDocumentoDetalle->id;
                                        if (!$this->CodigoDocumento->CodigoDocumentoDetalle->SeriesUsuario->save($usuario)){
                                            $done = false;
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                } else $done = false;
				
                if ($done){
                    $this->CodigoDocumento->commit();
                    $this->Session->setFlash('Se ha modificado correctamente el Codigo de Documento');
                    $this->redirect(array('action'=>'index'));
                } else {
                    $this->CodigoDocumento->rollback();
                    $this->Session->setFlash('Se ha producido un error al adicionar el Codigo de Documento');
                }
            } catch(Exception $e){
                $this->CodigoDocumento->rollback();
                $this->Session->setFlash('Se ha producido un error al adicionar el Codigo de Documento');
            }
        } else {
            $this->CodigoDocumento->recursive = 2;
            $this->CodigoDocumento->CodigoDocumentoDetalle->unBindModel(array(
                'hasAndBelongsToMany'=>array('Usuario')
            ));
            $datax = $this->CodigoDocumento->find('first',array(
				'conditions'=>array('CodigoDocumento.id'=>$id),
				'contain'=>array()
				)
			);
			
			$this->loadModel('CodigoDocumentoDetalle');
            $this->data = $this->CodigoDocumentoDetalle->find('all',array(
				'conditions'=>array(
					'CodigoDocumentoDetalle.codigo_documento_id'=>$id,
					'CodigoDocumentoDetalle.centro_dist_id'=>$this->centroDistId(),
					),
				'order'=>array('CodigoDocumentoDetalle.serie'),
				'contain'=>array(
					'SeriesUsuario'),				
				)
			);
			$new=array();
			$i=0;
			foreach($this->data as $d){
				$new['CodigoDocumentoDetalle'][$i]=$d['CodigoDocumentoDetalle'];
				$new['CodigoDocumentoDetalle'][$i]['SeriesUsuario']=$d['SeriesUsuario'];
				$i++;
			}
			$new['CodigoDocumento']=$datax['CodigoDocumento'];
			$new['CodigoDocumento']['centro_dist_id']=$this->centroDistId();
			// echo'<pre>';print_r($new);die;
			$this->data=$new;	
        }
        $this->set('usuarios',
			$this->Usuario->find('list', array(
				'fields'=>array('Usuario.id', 'Usuario.usuario'),
				'order'=>array('Usuario.usuario'),
				'conditions'=>array('Usuario.activo'=>true)
			)
        ));
    }

    function delete($id = null, $verbose = true){
        if (!$id) {
            if ($verbose){
                $this->Session->setFlash(__('Id de Codigo de Documento invalido', true));
                $this->redirect(array('action'=>'index'));
            }
            else return false;
        }
        $this->CodigoDocumento->recursive = -1;
        $data = $this->CodigoDocumento->read(null, $id);
        $usuario = $this->Session->read('Usuario');
        $data['CodigoDocumento']['activo']=0;
        $data['CodigoDocumento']['usuario_borrado_id']=$usuario['id'];
        $data['CodigoDocumento']['fecha_borrado']='now()';

        if (!$this->CodigoDocumento->save($data) && !verbose)
                return false;
        if ($verbose){
            $this->Session->setFlash(__('Codigo de Documento eliminado', true));
            $this->redirect(array('action'=>'index'));
        }
        else return true;
    }

    function process(){
        $op = isset($this->params['form']['delete'])?'eliminar':'anular';
        $flag = true;
        $i = 0;
        foreach($this->data as $item){
            if ($item['id']!='0'){
                if(isset($this->params['form']['delete'])){ // eliminar
                    $flag = $this->delete($item['id'], false);
                }
                if (!$flag){
                    $data = $this->CodigoDocumento->read(null, $item['CodigoDocumento']['id']);
                    $this->Session->setFlash(__("Se ha producido un error al $op el Codigo de Documento #".$data['CodigoDocumento']['id'], true));
                    break;
                }
            }
            $i++;
        }
        if ($flag && $i > 0){
            $this->Session->setFlash(__("El proceso de $op Codigos de Documentos se ha realizado con exito.", true));
        }
        $this->redirect(array('action'=>'index'));
    }

    function numerar($codigo = null, $numero = null){
        if (empty($codigo)||empty($numero)){
            $this->Session->setFlash('Los parametros no son correctos');
            $this->redirect(array('action'=>'index'));
        }
        
        $result = $this->CodigoDocumento->validNumber($codigo, $numero, $this->_usuario);
        if (empty($result['result']) && !empty($result['Mensaje'])){
            $this->Session->setFlash($result['Mensaje']);
            $this->redirect(array('action'=>'index'));
        } else {
            $detalle = $this->CodigoDocumento->CodigoDocumentoDetalle->find('first',array(
                'conditions'=>array(
                    'empresa_id'=>$this->empresaId(),
                    'codigo_documento_id'=>$codigo,
                    'serie'=>substr($numero,0,3)
                ),
                'recursive'=>-1
            ));

            $detalle['CodigoDocumentoDetalle']['ultimo_uso'] = $numero;
            if (!$this->CodigoDocumento->CodigoDocumentoDetalle->save($detalle))
                $this->Session->setFlash('Se ha producido un error al actualizar el numero');
            else
                $this->Session->setFlash('Se ha actualizado el numero de la serie indicada');

            $this->redirect(array('action'=>'index'));
        }
    }
	function buscar($q = null){
		if(!empty($this->data['CodigoDocumento']['q'])){
			$q = $this->data['CodigoDocumento']['q'];
		} elseif (!empty($this->params['url']['q'])){
			$q = $this->params['url']['q'];
		} elseif (!empty($this->params['form']['q'])){
			$q = $this->params['form']['q'];
		}
		
		if(empty($q)){
			$result = array('Error'=>'No se establecieron los parámetros adecuadamente');
		} else {
			$conditions = array(
				'CodigoDocumento.activo' => 1,
				'OR'=>array(
					'cast(CodigoDocumento.id as varchar) LIKE' => strtoupper($q).'%',
					'CodigoDocumento.descripcion LIKE' => '%'.strtoupper($q).'%')
			);
			$fields = array(
				'CodigoDocumento.id',				
				'CodigoDocumento.descripcion',				
				'CodigoDocumento.simbolo',
			);			
			
			$this->CodigoDocumento->Behaviors->attach('Containable');
			$result = $this->CodigoDocumento->find('all', array(
				'conditions' => $conditions,
				'fields' => $fields,
				'recursive'=>-1,
				'order'=>array('CodigoDocumento.descripcion ASC')				
			));
		}
		
		//definiendo valores en caso q sea una petición para autocompletado
		if(!empty($this->params['url']['autocomplete']) || !empty($this->params['form']['autocomplete'])){
			$res = array();
			foreach($result as $value){
				$res[] = array('value'=>$value['CodigoDocumento']['id'], 'display'=>'<span style="color:gray;font-size:.9em">'.$value['CodigoDocumento']['id'].'</span><div style="float:right;font-size:.8em" title="'.$value['CodigoDocumento']['descripcion'].'">'. $this->neat_trim($value['CodigoDocumento']['descripcion'], 24) .'</div>');
			}
			$result = $res;
		}
		
		if ($this->RequestHandler->isAjax()){
			if(empty($result)){
				$result = array('error'=>'No se encontro resultados');
			}
			$this->_ajaxify($result);
		} else {
			return $result;
		}
	}

    function reporteCodigoDocumento(){
        $conditions['CodigoDocumento.activo'] = true;

        $codigos = $this->CodigoDocumento->find('all',array(
            'conditions'=>$conditions,
            'order'=>'CodigoDocumento.id',
            'recursive'=>-1
        ));
        $this->reporte_html();
        $this->set(compact('codigos'));
    }


}
?>